#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
API测试工具包命令行接口
"""

import argparse
import sys
from typing import List, Optional

from .commands.har_converter import HarConverterCommand
from .commands.project_creator import ProjectCreatorCommand
from .commands.test_runner import RunnerCommand
from .core.logger import Log
from .core.emoji_utils import EmojiUtils

log = Log()


def create_parser() -> argparse.ArgumentParser:
    """
    创建命令行参数解析器
    
    Returns:
        argparse.ArgumentParser: 配置好的参数解析器
    """
    parser = argparse.ArgumentParser(
        prog="pax",
        description="PyAssured - 功能强大的Python API测试框架，提供HAR转换、项目创建、测试执行等功能",
        formatter_class=argparse.RawDescriptionHelpFormatter,
        epilog="""
示例用法:
  pax har2api login.har                        # 转换HAR文件为API文件
  pax create-project my_project                # 创建新的测试项目
  pax run --pattern "test_*.py"         # 运行测试用例
  pax run --tag smoke                   # 运行带有smoke标签的测试
        """
    )

    parser.add_argument(
        "--version",
        action="version",
        version="%(prog)s 1.0.0"
    )

    # 创建子命令
    subparsers = parser.add_subparsers(
        dest="command",
        help="可用的命令",
        metavar="COMMAND"
    )

    # HAR转换命令
    har_parser = subparsers.add_parser(
        "har2api",
        help="将HAR文件转换为API文件",
        description="将HAR（HTTP Archive）文件转换为符合项目规范的Python API类文件"
    )
    har_parser.add_argument(
        "har_file",
        help="HAR文件路径"
    )
    har_parser.add_argument(
        "-o", "--output",
        help="输出目录（默认为当前目录的api文件夹）"
    )
    har_parser.add_argument(
        "--class-prefix",
        default="",
        help="生成的类名前缀"
    )
    har_parser.add_argument(
        "--class-suffix",
        default="Api",
        help="生成的类名后缀（默认为Api）"
    )

    # 项目创建命令
    create_parser = subparsers.add_parser(
        "create-project",
        help="创建新的测试项目",
        description="创建一个完整的API测试项目结构"
    )
    create_parser.add_argument(
        "project_name",
        help="项目名称"
    )
    create_parser.add_argument(
        "-t", "--template",
        choices=["basic"],
        default="basic",
        help="项目模板类型（默认为basic）"
    )
    create_parser.add_argument(
        "--with-docker",
        action="store_true",
        help="包含Docker配置文件"
    )

    # 测试运行命令
    test_parser = subparsers.add_parser(
        "run",
        help="运行测试用例",
        description="执行测试用例并生成报告"
    )
    test_parser.add_argument(
        "-p", "--pattern",
        default="test_*.py",
        help="测试文件匹配模式（默认为test_*.py）"
    )
    test_parser.add_argument(
        "-t", "--tag",
        action="append",
        help="运行指定标签的测试（可多次使用）"
    )
    test_parser.add_argument(
        "-e", "--env",
        default="test",
        help="测试环境（默认为test）"
    )
    test_parser.add_argument(
        "--parallel",
        type=int,
        help="并行执行的进程数"
    )
    test_parser.add_argument(
        "--report-format",
        choices=["allure", "html", "json"],
        default="allure",
        help="报告格式（默认为allure）"
    )
    test_parser.add_argument(
        "--output-dir",
        default="./report",
        help="报告输出目录（默认为./report）"
    )
    test_parser.add_argument(
        "--reruns",
        type=int,
        help="失败测试的重试次数（覆盖配置文件设置）"
    )
    test_parser.add_argument(
        "--reruns-delay",
        type=float,
        help="重试之间的延迟时间（秒，覆盖配置文件设置）"
    )

    return parser


def main(argv: Optional[List[str]] = None) -> int:
    """
    主入口函数
    
    Args:
        argv: 命令行参数列表，如果为None则使用sys.argv
        
    Returns:
        int: 退出码，0表示成功，非0表示失败
    """
    parser = create_parser()
    args = parser.parse_args(argv)

    if not args.command:
        parser.print_help()
        return 1

    try:
        if args.command == "har2api":
            command = HarConverterCommand()
            return command.execute(args)
        elif args.command == "create-project":
            command = ProjectCreatorCommand()
            return command.execute(args)
        elif args.command == "run":
            command = RunnerCommand()
            return command.execute(args)
        else:
            log.error(f"{EmojiUtils.ERROR} 未知命令: {args.command}")
            return 1

    except KeyboardInterrupt:
        log.info(f"{EmojiUtils.INFO} 用户中断操作")
        return 130
    except Exception as e:
        log.error(f"{EmojiUtils.ERROR} 执行命令时发生错误: {e}")
        return 1


if __name__ == "__main__":
    sys.exit(main())
